home *** CD-ROM | disk | FTP | other *** search
/ EnigmA Amiga Run 1995 October / EnigmA AMIGA RUN 01 (1995)(G.R. Edizioni)(IT)[!][issue 1995-10][Aminet 7].iso / Aminet / comm / fido / RFS275.lha / rexx / RFH.src < prev    next >
Text File  |  1995-04-15  |  25KB  |  592 lines

  1. Options Results
  2. template="PORT/A,LINE/A,CFG/K";cfg=""
  3. if arg()=0 then do;say template;exit;end
  4. parse arg args
  5. if ~ReadArgs(args,template) then do;say Fault(RC,template);exit 10;end
  6. else do
  7.   LG=lower(port)'wpl';line=strip(line)
  8.   if cfg="" then cfg="CFG:RFH.CFG"
  9. end
  10. sv="v"right(v,5);app="RFH "sv;MP="RFH"line;mport=upper(port)||line
  11. Options failat 99
  12. numeric digits 14
  13. Signal On Syntax
  14. signal on halt
  15. cr='0D'x;lf="0A"x;LBUF="";ABUF="";MBUF=""
  16. HydraReq='T:HydraReq.'||line
  17. if showlist('P',MP) then do;address LOGPROC 'Putlog 'LG time() line MP': 'app' already open';exit 10;end
  18. if ~openport(MP) then do;address LOGPROC 'Putlog 'LG time() line MP': Could not open 'MP', quitting';exit 10;end
  19. call setconfig()
  20. r.1='Unregistered Node';r.2='Excluded Node';r.3='Excluded Point';r.4='Unlisted System'
  21. e.1='Duplicate Request Ignored';e.2='File Not Found';e.3='Password Missing or Invalid'
  22. e.4='File Not Available On This System';e.5='Request Exceeded Maximum Requests';e.6='Request Exceeded Byte count'
  23. address LOGPROC 'Putlog 'LG time() line app 'Ready'
  24. quitflag=0
  25. do forever
  26.   drop p entry RFunc cmdword
  27.   if quitflag=1 then leave
  28.   t=waitpkt(MP)
  29.   do ff=1
  30.     p=getpkt(MP)
  31.     if c2d(p)=0 then leave ff
  32.     RFunc=getarg(p)
  33.     cmdword=(upper(word(RFunc,1)))
  34.     if cmdword="REQ" | cmdword="RFHCFG" | cmdword="RFHSHOW" | cmdword="RFHEXIT" then call reply(p,0)
  35.     else call reply(p,5)
  36.     select
  37.       when cmdword="REQ" then do
  38.         Parse var RFunc junk' 'baud H_A Infile Listed FNC HYD R_A R_S
  39.         xfq_site_object=XfqGetAddress(R_A)
  40.         if ~XfqHoldMailer(xfq_site_object) then do
  41.           address LOGPROC 'Putlog 'LG time() line MP 'HOLD Failed:'XFQERRORMSG R_A
  42.           drop XFQERRORCODE XFQERRORMSG
  43.         end;else do
  44.           call do_req()
  45.           drop junk Baud H_A Infile Listed FNC HYD R_A R_S
  46.           drop NumRequested ReqName SendFname Fname Fsize Fdesc Mname Password Update UDT UpDt Jdate 
  47.           drop Num ReqCount SentCount SearchResult FirstDate NumReqs ReqFiles Sent ReqBytes TBytes LastBytes UserCalls
  48.           drop file sendas
  49.         end
  50.       end
  51.       when cmdword="RFHEXIT" then quitflag=1
  52.       when cmdword="RFHCFG" then call setconfig()
  53.       when cmdword="RFHSHOW" then call showconfig()
  54.       otherwise nop
  55.     end
  56.   end
  57. end
  58. address LOGPROC 'Putlog 'LG time() line MP 'port closed'
  59. exit
  60.  
  61. do_req:
  62. parse var R_A hisaddress.domain '#' hisaddress.zone ':' hisaddress.net '/' hisaddress.node '.' hisaddress.point
  63. R_S=strip(R_S);if R_S="" then R_S="Unknown Sysop"
  64. address LOGPROC 'Putlog 'LG time() Line app 'Serving 'R_S' of 'R_A' on 'MPORT' FNC:'fnc' HYD:'hyd
  65. HBUF="";LBUF="";ABUF="";MBUF="";pbuf="";tlist="T:RFH_t"Line;ulist="T:RFH_u"Line;a=0;b=0;i=0;x=0;Sent=0;TBytes=0
  66. FreqLst=SFreqLst
  67. LBUF=LBUF||date() time()' RFH Serving 'R_S' of 'R_A' on 'MPORT||lf
  68. parse var H_A myaddress.domain '#' myaddress.zone ':' myaddress.net '/' myaddress.node '.' myaddress.point
  69. if HYD=1 then SessMaxReqNames=3;else SessMaxReqNames=MaxReqNames
  70.  
  71. if ~ReqPoint & (hisaddress.point > "0") then return badsite(r.3,R_A,R_S)
  72. else if ~ReqUnlisted & ~Listed then return badsite(r.4,R_A,R_S)
  73.  
  74. if INCLUDE.0~=0 then do zz=1 to INCLUDE.0
  75.   validnode=0
  76.   if matchpattern(Include.zz,R_A,"N") then do
  77.     validnode=1
  78.     leave
  79.   end
  80.   if ~validnode then return badsite(r.1,R_A,R_S)
  81. end
  82. if EXCLUDE.0~=0 then do zz=1 to EXCLUDE.0
  83.   if matchpattern(Exclude.zz,R_A,"N") then return badsite(r.2,R_A,R_S)
  84. end
  85. if PRIVLEDGED.0~=0 then do zz=1 to PRIVLEDGED.0
  86.   if matchpattern(Privledged.zz,R_A,"N") then do
  87.     LBUF=LBUF||date() time() Line R_A 'granted privledged access'lf
  88.     if exists(PFreqLst) then FreqLst=PFreqLst
  89.     else LBUF=LBUF||date() time() Line 'Cannot find 'PFreqLst||lf
  90.   end
  91. end
  92. AcctFile=AcctPath||translate(R_A,'...','#:/')
  93. if exists(AcctFile) then do
  94.   call open('Acct',AcctFile,'R')
  95.   FirstDate=readln('Acct')
  96.   LastDate=readln('Acct')
  97.   NumReqs=readln('Acct')
  98.   ReqFiles=readln('Acct')
  99.   ReqBytes=readln('Acct')
  100.   LastBytes=readln('Acct')
  101.   UserCalls=readln('Acct')
  102.   call close('Acct')
  103.   if LastDate~=Date() then LastBytes=0
  104.   UserCalls=UserCalls+1
  105. end;else do
  106.   FirstDate=Date();LastDate=Date();NumReqs=0;ReqFiles=0;ReqBytes=0;LastBytes=0;UserCalls=0
  107. end
  108. SessBytes=MaxBytes
  109. if LIMITED.0~=0 then do zz=1 to LIMITED.0
  110.   if matchpattern(word(Limited.zz,1),R_A,"N") then do
  111.     SessBytes=word(Limited.zz,2)
  112.     address LOGPROC 'Putlog 'LG time() Line "Reducing Max Bytes for LIMITED site to "SessBytes
  113.     LBUF=LBUF||date() time() Line' Reducing Max Bytes to 'SessBytes' for 'R_S' of 'R_A' -> Limited Node!'lf
  114.     leave
  115.   end
  116. end
  117.  
  118. NumRequested=1
  119. if ~open(RQ,Infile,'R') then do
  120.   address LOGPROC 'Putlog 'LG time() Line "Unable to read "Infile
  121.   LBUF=LBUF||date() time() Line Infile' from 'R_S' of 'R_A' -> Not Found'lf
  122.   call end_session()
  123.   return
  124. end
  125. do while ~eof(RQ)
  126.   FName.NumRequested=upper(strip(readln(RQ),"B",CR))
  127.   MName.NumRequested=""
  128.   if left(FName.NumRequested,1)=";" | left(FName.NumRequested,3)="---" then iterate
  129.   if right(FName.NumRequested,1)=D2C('13') then FName.NumRequested=left(FName.NumRequested,Length(FName.NumRequested)-1)
  130.   if length(FName.NumRequested) < 1 then leave
  131.   Update.NumRequested=""
  132.   Password.NumRequested=""
  133.   if words(FName.NumRequested) > 1 then do
  134.     if left(word(FName.NumRequested,2),1)="!" then Password.NumRequested=SubStr(Word(FName.NumRequested,2),2)
  135.     if left(word(FName.NumRequested,2),1)="+" then Update.NumRequested=Word(FName.NumRequested,2)
  136.     else if left(word(FName.NumRequested,2),1)="-" then Update.NumRequested=Word(FName.NumRequested,2)
  137.     else if words(FName.NumRequested)=3 then do
  138.       if left(word(FName.NumRequested,3),1)="!" then Password.NumRequested=SubStr(Word(FName.NumRequested,3),2)
  139.       if left(word(FName.NumRequested,3),1)="+" then Update.NumRequested=Word(FName.NumRequested,3)
  140.       else if left(word(FName.NumRequested,3),1)="-" then Update.NumRequested=Word(FName.NumRequested,3)
  141.     end
  142.     FName.NumRequested=word(FName.NumRequested,1)
  143.   end
  144.   NumRequested=NumRequested+1
  145. end
  146. call close(RQ)
  147. NumRequested=NumRequested-1
  148. call FindRequests
  149. do a=1 to NumRequested
  150.   if (SessMaxReqNames>0 & a>SessMaxReqNames) | SendFName.a.SentFiles=0 then SendFName.a.SentFiles=1
  151.   do b=1 to SendFName.a.SentFiles
  152.     if SendFName.a.b="Duplicate Request Ignored" then do;call RspErr(e.1,a,FName.a);iterate;end
  153.     else if SendFName.a.b="File Not Found" then do;call RspErr(e.2,a,FName.a);iterate;end
  154.     else if SendFName.a.b="Bad Password" then do;call RspErr(e.3,a,FName.a,Password.a);iterate;end
  155.     else if SendFName.a.b="File Not Available" then do;call RspErr(e.4,a,FName.a,Password.a);iterate;end
  156.     else if SendFName.a.b="Too Many Requests" | (SessMaxReqNames>0 & a>SessMaxReqNames) then do;call RspErr(e.5,a,FName.a);iterate;end
  157.     else if SendFName.a.b="Too Many Bytes" then do;call RspErr(e.6,a,FName.a);iterate;end
  158.     else if SubWord(SendFName.a.b,1,3)="Update request failed:" then do
  159.       MBUF=MBUF||'Request Number 'a  'Requested: 'FName.a||cr'Date : 'JDate.a.b||cr'Error: 'SendFName.a.b||cr||cr
  160.       LBUF=LBUF||date() time()' 'FName.a' -=> Error: 'SendFName.a.b||lf
  161.       iterate
  162.     end;else do
  163.       Sent=Sent+1
  164.       if MName.a.b~="" then do
  165.         MBUF=MBUF||'Request Number 'a  'Requested: 'FName.a||' Sent:'MName.a.b||cr'Size : 'FSize.a.b' bytes'cr'Desc : 'FDesc.a.b||cr||cr
  166.         LBUF=LBUF||date() time()' 'FName.a '['MName.a.b'] ('FSize.a.b' bytes)'lf
  167.       end;else do
  168.         MBUF=MBUF||'Request Number 'a  'Requested: 'FName.a||cr'Size : 'FSize.a.b' bytes'cr'Desc : 'FDesc.a.b||cr||cr
  169.         LBUF=LBUF||date() time()' 'FName.a' ('FSize.a.b' bytes)'lf
  170.       end
  171.     end
  172.   end
  173. end
  174. if (SessMaxReqNames>0) & (NumRequested>SessMaxReqNames) then MBUF=MBUF||'Remaining Requests skipped for exceeding request limits'cr
  175. call writepkt(MBUF)
  176. if SysopReport then call writepkt(MBUF,'S')
  177. drop MBUF
  178. LBUF=LBUF||date() time()' Sending 'Sent' file(s), 'TBytes' bytes this request'lf||date() time()' Totals: 'NumReqs+1' request(s) for 'ReqFiles+Sent' file(s) ('ReqBytes+TBytes' bytes)'lf
  179. ABUF=ABUF||FirstDate||lf||Date()||lf||NumReqs+1||lf||ReqFiles+Sent||lf||ReqBytes+TBytes||lf||LastBytes+TBytes||lf||UserCalls||lf
  180.  
  181. if HYD then do
  182. if open(H,HydraReq,'A') then address LOGPROC 'PutLog 'LG time() Line MP "Appending to "HydraReq
  183. else do
  184.   if open(H,HydraReq,'W') then address LOGPROC 'PutLog 'LG time() Line MP "Creating "HydraReq
  185.   else do
  186.     address LOGPROC 'PutLog 'LG time() Line MP "Unable to write "HydraReq
  187.     call end_session()
  188.     return
  189.   end
  190. end
  191. call writech(H,Hbuf);call close(H);drop Hbuf
  192. call SetClip('HYDREQ'line,"OK")
  193. end
  194. call end_session()
  195. Return
  196.  
  197. FindRequests:
  198. Num=NumRequested
  199. if (SessMaxReqNames~=0) & (NumRequested>SessMaxReqNames) then Num=SessMaxReqNames
  200. LBUF=LBUF||date() time()' Using 'FreqLst||lf
  201. do ReqCount=1 to Num
  202.   address LOGPROC 'PutLog 'LG time() Line MP "Searching for Req:"ReqCount":"FName.ReqCount" in "FREQLST
  203.   SentCount=1;notfound=1
  204.   SendFName.ReqCount.SentCount="File Not Found"
  205.  
  206.   if ReqCount>1 then do
  207.     dupe=0
  208.     do fz=1 to ReqCount-1
  209.       if upper(Fname.ReqCount)=upper(Fname.fz) then dupe=1
  210.     end
  211.     if dupe then do
  212.       SendFName.ReqCount.SentCount="Duplicate Request Ignored"
  213.       address LOGPROC 'PutLog 'LG time() Line MP "Req:"ReqCount":"FName.ReqCount SendFName.ReqCount.SentCount
  214.       Iterate
  215.     end
  216.   end
  217.   sopt=""
  218.   if SortedLst then sopt="-s"
  219.   if MatchFirst then address COMMAND 'Fsearch >'tlist FREQLST Fname.ReqCount '-o' sopt
  220.   else address COMMAND 'Fsearch >'tlist FREQLST Fname.ReqCount sopt
  221.   call open('tq',tlist,'r')
  222.   do while ~eof('tq')
  223.     SearchResult=strip(readln('tq'))
  224.     if SearchResult="" then Iterate
  225.     if SearchResult="!@ No match found" then do
  226.       SendFName.ReqCount.SentCount="File Not Found"
  227.       Leave
  228.     end
  229.     if MatchFirst then do
  230.       call sendifok
  231.       Leave
  232.     end
  233.     call sendifok
  234.     SentCount=SentCount+1
  235.     if MultiMagic | ~MatchFirst then Iterate;else Leave
  236.   end
  237.   call close('tq');call delete(tlist)
  238.   if SentCount=0 then SendFname.ReqCount.SentFiles=1
  239.   else if SentCount > 1 then SendFname.ReqCount.SentFiles=SentCount-1
  240.   else SendFname.ReqCount.SentFiles=SentCount
  241. end
  242. Return
  243.  
  244. sendifok:
  245. sendit=1
  246. if index(SearchResult,'!')=0 then SendFname.ReqCount.SentCount=upper(subword(SearchResult,2))
  247. else do
  248.   if upper(Password.ReqCount)~=strip(upper(delstr(word(SearchResult,2),1,1))) then do
  249.     SendFName.ReqCount.SentCount="Bad Password"
  250.     sendit=0
  251.   end;else SendFname.ReqCount.SentCount=upper(subword(SearchResult,3))
  252. end
  253. if ~sendit then return sendit
  254. if ~exists(SendFName.ReqCount.SentCount) then do
  255.   SendFName.ReqCount.SentCount="File Not Available"
  256.   sendit=0
  257. end;else do
  258.   FName.ReqCount.SentCount=get_fn(SendFName.ReqCount.SentCount)
  259.   filestats=statef(SendFName.ReqCount.SentCount)
  260.   FSize.ReqCount.SentCount=word(filestats,2)
  261.   TBytes=TBytes+FSize.ReqCount.SentCount
  262.   if SessBytes>0 & (TBytes>SessBytes) then do
  263.     SendFName.ReqCount.SentCount="Too Many Bytes"
  264.     TBytes=TBytes-FSize.ReqCount.SentCount
  265.     sendit=0
  266.   end
  267.   if (MaxDaily > 0) & (TBytes+LastBytes > MaxDaily) then do
  268.     SendFName.ReqCount.SentCount="Exceeded Daily Limit"
  269.     TBytes=TBytes-FSize.ReqCount.SentCount
  270.     sendit=0
  271.   end
  272.   FDesc.ReqCount.SentCount=get_fd(SendFName.ReqCount.SentCount,filestats)
  273.   if FDesc.ReqCount.SentCount="" then FDesc.ReqCount.SentCount="Sorry, description is unavailable"
  274.  
  275.   if Update.ReqCount ~="" then do
  276.     UDT.ReqCount=left(Update.ReqCount,1)
  277.     if substr(Update.ReqCount,2,1)="U" then do
  278.       Update.ReqCount=SubStr(Update.ReqCount,3)
  279.       UDT.Human=1
  280.     end;else do
  281.       Update.ReqCount=SubStr(Update.ReqCount,2)
  282.       UDT.Human=0
  283.     end
  284.     if UDT.Human then do
  285.       if length(strip(Update.ReqCount)) >6 then do
  286.         cktime=1
  287.         cmd='List DATES 'SendFName.ReqCount.SentCount' LFORMAT="%D%T" TO 'ulist
  288.       end;else do
  289.         cktime=0
  290.         cmd='List DATES 'SendFName.ReqCount.SentCount' LFORMAT="%D" TO 'ulist
  291.       end
  292.       Address Command cmd
  293.       call open('UFile',ulist,'R')
  294.       UpDt.ReqCount.SentCount=readln('UFile')
  295.       call close('UFile')
  296.       call Delete(ulist)
  297.       if cktime then UpDt.ReqCount.SentCount=space(translate(UpDt.ReqCount.SentCount,"",":"),0)
  298.       Mon=right('00'||(pos(substr(UpDt.ReqCount.SentCount,4,3),'JanFebMarAprMayJunJulAugSepOctNovDec')+2)/3,2)
  299.       if cktime then Jdate.ReqCount.SentCount=right(UpDt.ReqCount.SentCount,2)||Mon||left(UpDt.ReqCount.SentCount,2)||right(UpDt.ReqCount.SentCount,8)
  300.         else Jdate.ReqCount.SentCount=right(UpDt.ReqCount.SentCount,2)||Mon||left(UpDt.ReqCount.SentCount,2)
  301.     end;else do
  302.       x=statef(SendFName.ReqCount.SentCount)
  303.       JDate.ReqCount.SentCount=(86400*365*8)+(2*86400)+(((word(x,5))*86400)+(word(x,6)*60))
  304.     end
  305.     if (UDT.ReqCount="+") & (JDate.ReqCount.SentCount < Update.ReqCount) then do
  306.       SendFName.ReqCount.SentCount="Update request failed: File older than requested."
  307.       sendit=0
  308.     end
  309.     if (UDT.ReqCount="-") & (JDate.ReqCount.SentCount > Update.ReqCount) then do
  310.       SendFName.ReqCount.SentCount="Update request failed: File newer than requested."
  311.       sendit=0
  312.     end
  313.   end
  314. end
  315. if sendit then do
  316.   Mname.ReqCount.SentCount=get_fn(SendFname.ReqCount.SentCount)
  317.   if Fname.ReqCount=Mname.ReqCount.SentCount then Mname.ReqCount.SentCount=""
  318.   sendas=get_fn(SendFName.ReqCount.SentCount)
  319.   if FNC then do
  320.     mBUF=mBUF||cr'FileName Requested with EMSI FNC flag:'sendas||cr
  321.     lastp=lastpos('.',sendas)
  322.     if pos('.',sendas)~=lastp then sendas=space(overlay('.',translate(sendas,' ','.'),lastp,1),0)
  323.     sendas=compress(sendas,xrange('20'x,'2d'x)'2f'x||xrange('3a'x,'40'x)xrange('5b'x,'60'x)xrange('7b'x,'7f'x))
  324.     parse var sendas n '.' xx
  325.     sendas=strip(left(n,8))"."strip(left(xx,3))
  326.     drop n xx    
  327.     mBUF=mBUF||cr'FileName Converted per EMSI FNC flag:'sendas||cr
  328.   end
  329.   call queueadd(SendFName.ReqCount.SentCount,sendas,4)
  330. end
  331. return sendit
  332.  
  333. writepkt:
  334. sysrpt=arg(2)=="S"
  335. magicnum=x2d(time('s'))+randu(x2d(Pragma('ID')))+(randu(x2d(time('s')))*999999)+(random()*1000000)
  336. serial=reverse(right("0000"x||c2x(magicnum),8))
  337. if ~sysrpt then packet_name="T:"serial".PKT"
  338. else do
  339.   packet_name=get_path(Infile)||serial".PKT"
  340.   myaddress.imp_point=1
  341. end
  342.  
  343. d=date("S");t=time("N");parse var t hh":"mm":"ss
  344. yr=reverse(right("00"x||d2c(left(d,4)),2));mh=reverse(right("00"x||d2c((substr(d,5,2)-1)),2));dy=reverse(right("00"x||d2c(substr(d,7,2)),2))
  345. hr=reverse(right("00"x||d2c(hh),2));mn=reverse(right("00"x||d2c(mm),2));sc=reverse(right("00"x||d2c(ss),2))
  346.  
  347. zo=reverse(right("00"x||d2c(myaddress.zone),2));ndo=reverse(right("00"x||d2c(myaddress.node),2))
  348. nto=reverse(right("00"x||d2c(myaddress.net),2));po=reverse(right("00"x||d2c(myaddress.point),2))
  349. if sysrpt then do
  350.  po=reverse(right("00"x||d2c(myaddress.imp_point),2))
  351.  zd=reverse(right("00"x||d2c(myaddress.zone),2));ndd=reverse(right("00"x||d2c(myaddress.node),2))
  352.  ntd=reverse(right("00"x||d2c(myaddress.net),2));pd=reverse(right("00"x||d2c(myaddress.point),2))
  353. end;else do
  354.  zd=reverse(right("00"x||d2c(hisaddress.zone),2));ndd=reverse(right("00"x||d2c(hisaddress.node),2))
  355.  ntd=reverse(right("00"x||d2c(hisaddress.net),2));pd=reverse(right("00"x||d2c(hisaddress.point),2))
  356. end
  357. pbuf=ndo||ndd||yr||mh||dy||hr||mn||sc||copies("00"x,2)||"0200"x||nto||ntd||"DA"x||d2c(substr(sv,2,2))||copies("00"x,8)
  358. pbuf=pbuf||zo||zd||copies("00"x,2)||reverse(right("01"x||"00"x,2))||"00"x||d2c(substr(sv,5,2))||reverse(right("00"x||"01"x,2))
  359. pbuf=pbuf||zo||zd||po||pd||"ROOF"||"0200"x||ndo||ndd||nto||ntd||"11000000"x||left(date(),6) right(date(),2) "" right("0"||time(),8)||"00"x
  360.  
  361. if sysrpt then pbuf=pbuf||"SYSOP"||"00"x||app||"00"x||"Report for "R_S" at "R_A||"00"x
  362. else do
  363.   pbuf=pbuf||R_S||"00"x||app||"00"x||"Results of your file request"||"00"x
  364.   if myaddress.zone~=hisaddress.zone then pbuf=pbuf||"01"x||"INTL" hisaddress.zone":"hisaddress.net"/"hisaddress.node myaddress.zone":"myaddress.net"/"myaddress.node||cr
  365.   else pbuf=pbuf||"01"x||"MSGTO:" hisaddress.zone":"hisaddress.net"/"hisaddress.node||cr
  366.   if myaddress.point~=0 then pbuf=pbuf||"01"x||"FMPT" myaddress.point||cr;if hisaddress.point~=0 then pbuf=pbuf||"01"x||"TOPT" hisaddress.point||cr
  367.   pbuf=pbuf||"01"x||"MSGID: "myaddress.zone':'myaddress.net'/'myaddress.node'.'myaddress.point' 'd2x((date('I') * 86400)+time("S")+252460600) ||cr
  368. end
  369. pbuf=pbuf||"01"x||"PID: "app||cr
  370.  
  371. if ~sysrpt then do
  372.   pbuf=pbuf||cr"    Presenting "app", the WPL File Request ARexx Function Host"cr||cr
  373.   pbuf=pbuf||cr'The following are the results of your File Request:'cr||cr||arg(1)||cr
  374.   pbuf=pbuf||cr'Sending 'Sent' file(s), 'TBytes' bytes this request.'cr||cr'You have made a total of 'NumReqs+1' FileRequest(s) for 'ReqFiles+Sent' files ('ReqBytes+TBytes' bytes)'cr
  375.   pbuf=pbuf||cr'Files were requested from 'app' on 'H_A||cr
  376. end;else do
  377.   pbuf=pbuf||cr' Inbound File Request Tracking'||cr||cr
  378.   pbuf=pbuf||cr'   Address                :'right_justify(R_A,23)
  379.   pbuf=pbuf||cr'   Sysop                  :'right_justify(R_S,23)
  380.   pbuf=pbuf||cr'   First Call             :'right_justify(Firstdate,23)
  381.   pbuf=pbuf||cr'   Last Call              :'right_justify(LastDate,23)
  382.   pbuf=pbuf||cr'   Number of Requests     :'right_justify(NumReqs+1,23)
  383.   pbuf=pbuf||cr'   Files Transfered       :'right_justify(SENT,23)
  384.   pbuf=pbuf||cr'   Total Files Transfered :'right_justify(ReqFiles+SENT,23)
  385.   pbuf=pbuf||cr'   Bytes Sent This Call   :'right_justify(TBytes,23)
  386.   pbuf=pbuf||cr'   Bytes Sent Last Call   :'right_justify(LastBytes,23)
  387.   pbuf=pbuf||cr'   Total Bytes Sent       :'right_justify(ReqBytes+Tbytes,23)
  388.   pbuf=pbuf||cr'   Number of Sessions     :'right_justify(Usercalls,23)
  389.   pbuf=pbuf||cr'   Daily limits           :'right_justify(MaxDaily,23)
  390.   pbuf=pbuf||cr'   Session Limit          :'right_justify(SessBytes,23)||cr
  391.   pbuf=pbuf||cr' Session Particulars'cr||arg(1)||cr
  392. end
  393. pbuf=pbuf||cr||cr||cr||"--- Shelter "app||cr||cr||"000000"x
  394. if ~open('packet',packet_name,"W") then do;address LOGPROC 'PutLog 'LG time() Line MP "Couldn't open packet-file ["packet_name"]";return 20;end
  395. call writech('packet',pbuf);call close('packet');drop pbuf
  396. if ~sysrpt then call queueadd(packet_name,get_fn(packet_name),5)
  397. return 0
  398.  
  399. get_path:
  400.   pos=lastPos('/',arg(1))
  401.   if pos=0 then pos=LastPos(':',arg(1))
  402. return substr(arg(1),1,pos)
  403.  
  404. right_justify:
  405. if length(arg(1))>arg(2) then return (right(arg(1),arg(2)))
  406. else return (copies(" ",arg(2)-length(arg(1)))||arg(1))
  407.  
  408. queueadd:
  409. file=upper(arg(1))
  410. sendas=arg(2)
  411. flags=arg(3)
  412. if HYD then do
  413.   Hbuf=Hbuf||file sendas||'0a'x
  414.   return 0
  415. end
  416. WORK=NULL
  417. QUERY.XQ_NAME=file
  418. QUERY.XQ_SITE=xfq_site_object
  419. WORK=XfqFindWork(QUERY)
  420. if WORK=NULL then do
  421.   if ~XfqAddWorkQuick(R_A,file,sendas,120,flags) then do
  422.     address LOGPROC 'PutLog 'LG time() Line MP 'Queue 'file' Failed:'XFQERRORMSG R_A
  423.     drop XFQERRORCODE XFQERRORMSG
  424.   end;else do
  425.     address LOGPROC 'PutLog 'LG time() Line MP 'Queued 'file' as' sendas
  426.   end
  427. end;else do
  428.   call XfqUnlockWork(WORK)
  429.   address LOGPROC 'PutLog 'LG time() Line MP file 'already queued'
  430. end
  431. if WORK~=NULL then call XfqDropObject(WORK)
  432. return 0
  433.  
  434. get_fn:
  435. if LastPos('/',arg(1))~=0 then return SubStr(arg(1),LastPos('/',arg(1))+1)
  436. else if LastPos(':',arg(1))~=0 then return SubStr(arg(1),LastPos(':',arg(1))+1)
  437. else return arg(1)
  438.  
  439. badsite:
  440. address LOGPROC 'Putlog 'LG time() Line "Refusing Request! "arg(1)
  441. LBUF=LBUF||date() time() Line' Refusing request from 'arg(3)' of 'arg(2)' -> 'arg(1)||lf
  442. call writepkt('File request terminated: 'arg(1)||cr)
  443. call end_session()
  444. return 0
  445.  
  446. RspErr:
  447. MBUF=MBUF||'Request Number 'arg(2) 'Requested: 'arg(3)||cr'Error: 'arg(1)||cr||cr
  448. LBUF=LBUF||date() time()' 'FName.a' -=> Error: 'arg(1) arg(4)||lf
  449. return
  450.  
  451. setconfig:
  452. if ~open('cf',cfg,'r') then 
  453.  if ~open('cf',"RAM:RFH.cfg",'r') then 
  454.   if ~open('cf',"CFG:RFH.cfg",'r') then do;address LOGPROC 'PutLog 'LG time() Line 'Could not read RFH.cfg';exit;end
  455. exidx=1;ixidx=1;lxidx=1;pxidx=1
  456. do while ~eof('cf')
  457.   lx=readln('cf')
  458.   if lx="" | left(lx,1)=" " | left(lx,2)='/*' | left(lx,2)='*/' then iterate
  459.   parse var lx vn vv junkcomment
  460.   vn=upper(vn);vv=strip(vv)
  461.   select
  462.     when vn="PRIORITY" then priority=vv
  463.     when vn="SYSOPREPORT" then SysopReport=vv=="TRUE"
  464.     when vn="REQPOINT" then ReqPoint=vv=="TRUE"
  465.     when vn="REQUNLISTED" then ReqUnListed=vv=="TRUE"
  466.     when vn="SORTEDLST" then SortedLst=vv=="TRUE"
  467.     when vn="MULTIMAGIC" then MultiMagic=vv=="TRUE"
  468.     when vn="MATCHFIRST" then MatchFirst=vv=="TRUE"
  469.     when vn="FREQLST" then SFreqLst=dequote(vv)
  470.     when vn="PRIVLST" then PFreqLst=dequote(vv)
  471.     when vn="LOGFILE" then LogFile=dequote(vv)
  472.     when vn="ACCTPATH" then AcctPath=dequote(vv)
  473.     when vn="EXCLUDE" then do
  474.       EXCLUDE.exidx=translate(dequote(vv),"?","#")
  475.       exidx=exidx+1
  476.     end
  477.     when vn="INCLUDE" then do
  478.       INCLUDE.ixidx=translate(dequote(vv),"?","#")
  479.       ixidx=ixidx+1
  480.     end
  481.     when vn="LIMITED" then do
  482.       parse var junkcomment limit junkcomment
  483.       LIMITED.lxidx=translate(dequote(vv),"?","#")' 'limit
  484.       lxidx=lxidx+1
  485.     end
  486.     when vn="PRIVLEDGED" then do
  487.       PRIVLEDGED.pxidx=translate(dequote(vv),"?","#")
  488.       pxidx=pxidx+1
  489.     end
  490.     when vn="MAXBYTES" then MaxBytes=vv
  491.     when vn="MAXDAILY" then MaxDaily=vv
  492.     when vn="MAXREQNAMES" then MaxReqNames=vv
  493.     otherwise address LOGPROC 'Putlog 'LG time() Line MP 'Config Error:'lx
  494.   end
  495. end
  496. call close('cf')
  497. if exidx>0 then EXCLUDE.0=exidx-1;else EXCLUDE.0=0
  498. if ixidx>0 then INCLUDE.0=ixidx-1;else INCLUDE.0=0
  499. if lxidx>0 then LIMITED.0=lxidx-1;else LIMITED.0=0
  500. if pxidx>0 then PRIVLEDGED.0=pxidx-1;else PRIVLEDGED.0=0
  501. if EXCLUDE.0>0 & INCLUDE.0>0 then address LOGPROC 'Putlog 'LG time() Line MP 'Config Error: Cannot BOTH INCLUDE and EXCLUDE sites'
  502. drop lx vv vn junkcomment exidx ixidx lxidx
  503. if Priority~=0 then oldpri=Pragma('Priority',Priority)
  504. address LOGPROC 'Putlog 'LG time() Line MP 'Config loaded, Pri:'priority
  505. return
  506.  
  507.  
  508. showconfig:
  509. address LOGPROC 'Putlog 'LG time() Line 'Configuration'
  510. address LOGPROC 'Putlog 'LG time() Line 'Priority:'priority
  511. address LOGPROC 'Putlog 'LG time() Line 'reqPoint:'reqpoint
  512. address LOGPROC 'Putlog 'LG time() Line 'ReqUnlisted:'requnlisted
  513. address LOGPROC 'Putlog 'LG time() Line 'SortedLst:'sortedlst
  514. address LOGPROC 'Putlog 'LG time() Line 'MultiMagic:'multimagic
  515. address LOGPROC 'Putlog 'LG time() Line 'MatchFirst:'matchfirst
  516. address LOGPROC 'Putlog 'LG time() Line 'FREQLST:'sfreqlst
  517. address LOGPROC 'Putlog 'LG time() Line 'PRIVLST:'pfreqlst
  518. address LOGPROC 'Putlog 'LG time() Line 'Logfile:'logfile
  519. address LOGPROC 'Putlog 'LG time() Line 'AcctPath:'acctpath
  520. address LOGPROC 'Putlog 'LG time() Line 'MaxBytes:'maxbytes
  521. address LOGPROC 'Putlog 'LG time() Line 'MaxDaily:'maxdaily
  522. address LOGPROC 'Putlog 'LG time() Line 'MAxReqNames:'maxreqnames
  523. address LOGPROC 'Putlog 'LG time() Line 'Excludes:'exclude.0
  524. if exclude.0~=0 then do i=1 to exclude.0
  525. address LOGPROC 'Putlog 'LG time() Line 'Excluded:'exclude.i
  526. end
  527. address LOGPROC 'Putlog 'LG time() Line 'Includes:'include.0
  528. if include.0~=0 then do i=1 to include.0
  529. address LOGPROC 'Putlog 'LG time() Line 'Included:'include.i
  530. end
  531. address LOGPROC 'Putlog 'LG time() Line 'Limited:'limited.0
  532. if limited.0~=0 then do i=1 to limited.0
  533. address LOGPROC 'Putlog 'LG time() Line 'Limited:'limited.i
  534. end
  535. address LOGPROC 'Putlog 'LG time() Line 'Privledged:'privledged.0
  536. if privledged.0~=0 then do i=1 to privledged.0
  537. address LOGPROC 'Putlog 'LG time() Line 'Privledged:'privledged.i
  538. end
  539. return
  540.  
  541.  
  542. lower:
  543. return(bitor(arg(1),'20'x))
  544.  
  545. Syntax: call template_oops "Syntax(RC="RC")" sigl
  546. failure: call template_oops "Failure(RC="RC")" sigl
  547. halt: call template_oops "Halt" sigl 
  548. template_oops:
  549. parse arg what badline
  550. address LOGPROC 'PutLog 'LG time() Line MP "ERROR "what" Line:"badline
  551. call end_session()
  552. exit
  553.  
  554. end_session:
  555. x=XfqReleaseMailer(xfq_site_object)
  556. call XfqDropObject(xfq_site_object)
  557. if WORK~=NULL then call XfqDropObject(WORK)
  558. call XfqClose()
  559. if ABUF~="" then do
  560.   address LOGPROC 'PutLog 'LG time() Line "Updating account"
  561.   call open('Acct',AcctFile,'W')
  562.   call Writech('Acct',ABUF||lf)
  563.   call close('Acct')
  564.   drop ABUF
  565. end
  566. LBUF=LBUF||date() time()' RFH session Ending'lf
  567. if LogFile~="" then do
  568.   if exists(LogFile) then call open('log',LogFile,'A');else call open('log',LogFile,'W')
  569.   call writech('log',LBUF||lf);call close('log')
  570. end;else do
  571.   i=1
  572.   loglen=length(LBUF)
  573.   do while i < loglen+1
  574.     alen=pos('0a'x, LBUF, i)-i
  575.     aline=substr(body,i,alen)
  576.     address LOGPROC 'PutLog 'LG Line aline
  577.     i=i+alen+1
  578.   end
  579.   drop alen aline i
  580. end
  581. drop LBUF
  582. call delete(infile)
  583. address LOGPROC 'PutLog 'LG time() Line 'RFH session with' R_A 'terminated'
  584. return 0
  585.  
  586. dequote:
  587. parse arg thing
  588. parse var thing '"' unq_thing '"'
  589. if unq_thing ~= "" then return unq_thing
  590. return thing
  591.  
  592.